package com.aerolinea;

import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;

import com.asiento.Asiento;
import com.lanchita.AerolineaLanchita;
import com.usuario.Usuario;

public class Lanchita implements Aerolinea {

	private static final Lanchita INSTANCE = new Lanchita();

	private Integer porcentaje;

	public static void establecerPorcentaje(Integer porcentaje) {
		INSTANCE.setPorcentaje(porcentaje);
	}

	@Override
	public Set<Asiento> buscar(Usuario usuario, String origen, String destino,
			String fechaSalida, String horaSalida, String fechaLlegada,
			String horaLlegada, String clase, String ubicacion) {

		String[][] asientos = AerolineaLanchita.getInstance()
				.asientosDisponibles(origen, destino, fechaSalida, horaSalida,
						fechaLlegada, horaLlegada);

		Set<Asiento> asientosResult = new HashSet<Asiento>();

		for (String[] asiento : asientos) {
			Asiento fAsiento = new Asiento(asiento, this);
			fAsiento.setPrecio(fAsiento.getPrecio() * this.getPorcentaje()
					/ 100 + usuario.getTipoUsuario().getRecargo());
			asientosResult.add(fAsiento);
		}

		asientosResult = filtrar(asientosResult, "clase", clase);
		asientosResult = filtrar(asientosResult, "ubicacion", ubicacion);

		return asientosResult;
	}

	private Set<Asiento> filtrar(Set<Asiento> asientos, String campo,
			String criterio) {

		Set<Asiento> asientosResult = new HashSet<Asiento>();
		String atributo;
		for (Asiento asiento : asientos) {
			try {
				Object asientoObject = asiento;
				Class<?> claseAsiento = asientoObject.getClass();
				Field atributoAsiento = claseAsiento.getDeclaredField(campo);
				atributoAsiento.setAccessible(true);
				atributo = (String) atributoAsiento.get(asientoObject);
			} catch (Exception e) {
				return asientos;
			}
			if (null != criterio) {
				if (atributo.equalsIgnoreCase(criterio)) {
					asientosResult.add(asiento);
				} else
					continue;
			} else
				return asientos;
		}

		return asientosResult;
	}

	@Override
	public void comprar(String codigo) {
		AerolineaLanchita.getInstance().comprar(codigo);

	}

	@Override
	public void reservar(String codigo, String dni) {
		AerolineaLanchita.getInstance().reservar(codigo, dni);
	}

	@Override
	public Integer getPorcentaje() {
		return porcentaje;
	}

	@Override
	public void setPorcentaje(Integer porcentaje) {
		this.porcentaje = porcentaje;
	}

	public static Lanchita getInstance() {
		return INSTANCE;
	}
}